"""

    本脚本，使用 pywinauto 控制应用软件的窗口事件，pyautogui控制鼠标键盘事件

    GUI 查看工具为 SPY++, 路径为：D:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\spyxx.exe (/用于窗口快速识别/)
    GUI 查看工具  inspect 路径为：D:\Windows Kits\10\bin\10.0.22621.0\x64\inspect.exe
    GUI 查看工具   UISPY  路径: E:\work_code\DesktopAutoTest\UISpy\UISpy.exe   (/推荐用UISPY，很好定位control元素/)
"""

# 记录信息
"""
0. 找到当前打开的控件，用pywinauto.Application().connect(title=窗口名称, path=启动路径, process=窗口进程id)
1. 如果是输入框类型的，可以先写标记文字做定位识别，如果是下拉或者按钮类型的，看看当前显示的文字来定位控件(control)      
2. 使用UISPY工具，快速锁定控件的类型与相对位置
3. 使用app['对话框完整title'] or app.window(title_re='.*xxx$') or app.title(/英文名称时/) 锁定当前弹窗或者被控窗口
4. 使用 app['对话框完整title'].window().print_control_identifiers()来识别在pywinauto中控件的相对名称，
    $. 窗口          在UISPY中为 [窗口 xx]   属性则是ControlType:	"ControlType.Window", xx为当前文字识别
    @. wxWindowNR,  在UISPY中为 [窗格 xx]   属性则是ControlType:	"ControlType.Pane", xx为当前文字识别
    a. Edit,        在UISPY中为 [编辑 xx]   属性则是ControlType:	"ControlType.Edit", xx为当前文字识别, type_keys("")
    b. Button,      在UISPY中为 [按钮 xx]   属性则是ControlType:	"ControlType.Button", xx为当前文字识别, click()
    c. ComboBox,    在UISPY中为 [组合框 xx] 属性则是ControlType:	"ControlType.ComboBox", xx为当前文字识别, select("选项文字")
    d. CheckBox,    在UISPY中为 [复选框 xx] 属性则是ControlType:	"ControlType.CheckBox", xx为当前文字识别, click()
    @. 标题栏,       在UISPY中为 [菜单栏 xx] 属性则是ControlType:	"ControlType.TitleBar", xx为当前文字识别
                        标题栏下的按钮可以统一为 app.title.maximize()/最大化/ .minimize()/最小化/, close()/关闭/
    @. 菜单栏,       在UISPY中为 [菜单栏 xx] 属性则是ControlType:	"ControlType.MenuBar", xx为当前文字识别
                        控制方法为menu_select("File->New")
    @. 工具栏,       在UISPY中为 [工具栏 xx] 属性则是ControlType:	"ControlType.ToolBar", xx为当前文字识别
                        在UISPY开启“鼠标”,在窗口中鼠标悬停item，则会刷新UISPY中的 工具item        
    @. 状态栏,       在UISPY中为 [状态栏 xx] 属性则是ControlType:	"ControlType.StatusBar", xx为当前文字识别
                        控制方法 app[title].StatusBar.texts() 获取所有状态信息 

    如下为print_control_identifiers 打印出来的实例， 
    wxWindowNR - 'panel'    (L-1650, T428, R-916, B803)
    ['panelwxWindowNR', 'panel', 'wxWindowNR']
    child_window(title="panel", class_name="wxWindowNR")
       | 
       | Edit - 'E:\工作项目\路测\后处理\定位采集数据后处理\sample_data_study\cpt7700_100hz_1123.gga'    (L-1590, T437, R-1183, B462)
       | ['基准Edit', 'Edit', 'Edit0', 'Edit1', '基准Edit0', '基准Edit1']
       | child_window(title="E:\工作项目\路测\后处理\定位采集数据后处理\sample_data_study\cpt7700_100hz_1123.gga", class_name="Edit")
       | 
       | Edit - ''    (L-1590, T472, R-1183, B497)
       | ['Edit2', '折线Edit', '折线Edit0', '折线Edit1']
       | child_window(class_name="Edit")
       | Button - '画图'    (L-1590, T717, R-1520, B742)
       | ['Button', '画图Button', '画图', 'Button0', 'Button1']
       | child_window(title="画图", class_name="Button")
       |
       | ComboBox - 'GGA'    (L-1095, T472, R-1025, B497)
       | ['折线ComboBox', 'ComboBox2', '折线ComboBox0', '折线ComboBox1']
       | child_window(title="GGA", class_name="ComboBox")
       |
       | CheckBox - '折线'    (L-1644, T472, R-1604, B496)
       | ['折线', 'CheckBox2', '折线CheckBox']
       | child_window(title="折线", class_name="Button")

5. 对可点击类型的控件，即属性为 UISPY 中 ControlType:	"ControlType.Button" 类型的可以点击, 或者ComboBox类型的点击，直接 select("选项文字")
        更多请用关键字搜索 控制类型(如, ComboBox) 官网https://pywinauto.readthedocs.io/en/latest/code/pywinauto.element_info.html?highlight=Rectangle 
*6.如果是像素定位识别，则可以返回上述每个控件的 rectangle() 属性，然后用pyautogui控制鼠标或者图像识别来操作，更多通用属性，可以搜索pywinauto.element_info
7. 利用app[title]下面的子窗口的 .draw_outline() 来确定与UISpy的定位的窗口做名称上的统一， 另外不用一层层的查找，因pywinauto采用字典的存储元素，所以只用命中元素key就行。

"""


import time

from pywinauto.application import Application
from pywinauto import Desktop
import pywinauto.keyboard as kb


app = Application(backend="uia").start("notepad.exe")
app = Application(backend="uia").start(r"D:\Program Files\Notepad++\notepad++.exe")

app.window().wrapper_object()


# 键盘自动输入
import time
import pywinauto.keyboard as kb
import pywinauto.mouse as mouse

# 发送键盘指令
# 打开命令行，输入脚本
# windows徽标键
kb.send_keys("{VK_LWIN}")
# cmd
kb.send_keys("cmd")

time.sleep(2)
# 回车
kb.send_keys("{VK_RETURN}")
time.sleep(2)
mouse.click(coords=(400, 400))  # 发现打开的cmd窗口不是当前窗口，所以用鼠标点击一下

# for /L %i in (1,1,100) do tree
# +对应Shift, ^对应Ctrl, %对应Alt
kb.send_keys("for /L +5i in +91,1,100+0 do tree", with_spaces=True)
kb.send_keys("{VK_RETURN}")

# import time
# import pywinauto.mouse as mouse
#
# # 移动鼠标
# for i in range(20):
#     x = i * 20
#     y = i * 16
#     mouse.move(coords=(x, y))
#     time.sleep(0.5)


